package com.hands.netty.netty;


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

/**
 * @Title: NioServerHandler
 * @Description: 服务器Channel通道初始化设置
 * @date 2018/6/415:29
 */
public class ServerChannelInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        ChannelPipeline pipeline = socketChannel.pipeline();

          /* LineBasedFrameDecoder的工作原理是：依次遍历ByteBuf中的可读字节，
        判断看其是否有”\n” 或 “\r\n”， 如果有就以此位置为结束位置。
        从可读索引到结束位置的区间的字节就组成了一行。 它是以换行符为结束标志的解码器，
        支持携带结束符和不带结束符两种解码方式，同时支持配置单行的最大长度，
        如果读到了最大长度之后仍然没有发现换行符，则抛出异常，同时忽略掉之前读到的异常码流。*/
        // pipeline.addLast(new LineBasedFrameDecoder(10010));
        //字符串解码和编码
        //LineBasedFrameDecoder + StringDecoder 就是一个按行切换的文本解码器。
        //pipeline.addLast( new StringDecoder());
        ByteBuf delimiter=Unpooled.copiedBuffer("$/r$\r\n".getBytes());//指定消息分割符处理数据
        pipeline.addLast(new DelimiterBasedFrameDecoder(1024*1024, delimiter));//如果取消了分割符解码，就会出现TCP粘包之类的问题了
        pipeline.addLast(new StringDecoder());
        pipeline.addLast( new StringEncoder());
        //pipeline.addLast( new MyDelimiterBasedFrameDecoder());
        
        //pipeline.addLast(new IdleStateHandler(30,30,30, TimeUnit.SECONDS));
        //服务器的逻辑
        pipeline.addLast("handler", new NioServerHandler());

    }


}